/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.notaria.guerrasalas.be;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToOne;
import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import javax.persistence.UniqueConstraint;

/**
 *
 * @author Administrador
 */
@Entity
@Table(name = "USUARIO", catalog = "BASE_NOTARIAL", schema = "dbo", uniqueConstraints = {@UniqueConstraint(columnNames = {"FID_PERSONA"})})
@NamedQueries({
    @NamedQuery(name = "Usuario.findAll", query = "SELECT u FROM Usuario u"),
    @NamedQuery(name = "Usuario.findByIdUsuario", query = "SELECT u FROM Usuario u WHERE u.idUsuario = :idUsuario"),
    @NamedQuery(name = "Usuario.findByLogin", query = "SELECT u FROM Usuario u WHERE LOWER(u.login) LIKE :login")
})
public class Usuario implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "ID_USUARIO", nullable = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long idUsuario;
    @Column(name = "LOGIN", length = 30)
    private String login;
    @Column(name = "PASSWORD", length = 30)
    private String password;
    @Enumerated(EnumType.ORDINAL)
    @Column(name = "ESTADO")
    private EstadoEntidad estado = EstadoEntidad.Activo;
    @Column(name = "FECHA_CREACION")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fechaCreacion = new Date();
    @Column(name = "FECHA_ACTUALIZACION")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fechaActualizacion;
    @Column(name = "FECHA_ELIMINACION")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fechaEliminacion;
    @JoinTable(name = "USUARIO_GRUPO",
    joinColumns = {
        @JoinColumn(name = "FID_USUARIO", referencedColumnName = "ID_USUARIO", nullable = false)},
    inverseJoinColumns = {
        @JoinColumn(name = "FID_GRUPO", referencedColumnName = "ID_GRUPO", nullable = false)
    })
    @ManyToMany(fetch = FetchType.LAZY)
    private List<Grupo> grupos;
    @JoinColumn(name = "FID_PERSONA", referencedColumnName = "ID_PERSONA")
    @OneToOne(fetch = FetchType.LAZY)
    private Persona persona;
    @Transient
    private boolean seleccionado;
    @Transient
    private String passwordEdit = "";
    @Transient
    private String passwordReview = "";

    @PreUpdate
    public void fechas() {
        setLogin(login.trim().toLowerCase());
        setPassword(password.trim());
        setFechaActualizacion(new Date());
    }

    @PrePersist
    public void eliminarEspacionEnBlanco() {
        setLogin(login.trim());
        setPassword(password.trim());
    }

    public Usuario() {
    }

    public Usuario(Long idUsuario) {
        this.idUsuario = idUsuario;
    }

    public Long getIdUsuario() {
        return idUsuario;
    }

    public void setIdUsuario(Long idUsuario) {
        this.idUsuario = idUsuario;
    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public EstadoEntidad getEstado() {
        return estado;
    }

    public void setEstado(EstadoEntidad estado) {
        this.estado = estado;
    }

    public Date getFechaCreacion() {
        return fechaCreacion;
    }

    public void setFechaCreacion(Date fechaCreacion) {
        this.fechaCreacion = fechaCreacion;
    }

    public Date getFechaActualizacion() {
        return fechaActualizacion;
    }

    public void setFechaActualizacion(Date fechaActualizacion) {
        this.fechaActualizacion = fechaActualizacion;
    }

    public Date getFechaEliminacion() {
        return fechaEliminacion;
    }

    public void setFechaEliminacion(Date fechaEliminacion) {
        this.fechaEliminacion = fechaEliminacion;
    }

    public List<Grupo> getGrupos() {
        return grupos;
    }

    public void setGrupos(List<Grupo> grupos) {
        this.grupos = grupos;
    }

    public String getGruposAsString() {
        String listaGrupos = "";
        if (grupos != null) {
            for (Grupo g : grupos) {
                listaGrupos = listaGrupos + (listaGrupos.trim().equals("") ? "" : ", ") + g.getNombre();
            }
        }
        return listaGrupos;
    }

    public Persona getPersona() {
        return persona;
    }

    public void setPersona(Persona persona) {
        this.persona = persona;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Usuario other = (Usuario) obj;
        if (this.idUsuario != other.idUsuario && (this.idUsuario == null || !this.idUsuario.equals(other.idUsuario))) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 3;
        hash = 97 * hash + (this.idUsuario != null ? this.idUsuario.hashCode() : 0);
        return hash;
    }

    @Override
    public String toString() {
        return "com.notaria.guerrasalas.be.Usuario[idUsuario=" + idUsuario + "]";
    }

    public boolean isSeleccionado() {
        return seleccionado;
    }

    public void setSeleccionado(boolean seleccionado) {
        this.seleccionado = seleccionado;
    }

    public String getPasswordReview() {
        return passwordReview;
    }

    public void setPasswordReview(String passwordReview) {
        this.passwordReview = passwordReview;
    }

    public String getPasswordEdit() {
        return passwordEdit;
    }

    public void setPasswordEdit(String passwordEdit) {
        this.passwordEdit = passwordEdit;
    }
}
